# -*- coding: utf-8 -*-
#   单表数据模型
# @Time    : 2023/1/30  18:14
# @Author  : 徐良
# File     : formModel.py

from typing import Optional, Dict, Any, List
from PySide6.QtCore import Qt, QModelIndex
from baseClass.model.editableQueryModel import EditableSqlModel
from dbService.db_service import get_model
from baseClass.business.sqlParseTool import SqlParseTool
import logging


class FormModel(EditableSqlModel):
    """
    表体数据模型（继承自BaseModel）

    功能特性：
    - 支持动态SQL查询构建
    - 自动处理表头显示
    - 支持行插入和删除
    - 与主表关联数据加载
    - 支持扩展参数传递

    使用方式：
    # 基础用法
    model = BodyModel(work=work_obj, b_sql="SELECT...", pid="1001")

    # 带扩展参数
    model = BodyModel(work=work_obj, pid="1001", custom_param=123)
    """

    def __init__(self, sql: str, align=None, field_chn_list: List[str]=None) -> None:
        """
        初始化单表模型
        :param sql:
        :param align:
        """
        super().__init__(sql)
        # 提取核心参数
        if align is None:
            self.align = []
        else:
            self.align = align

        if field_chn_list is None:
            self.field_chn_list = []
        else:
            self.field_chn_list = field_chn_list


    def headerData(self, section: int, orientation: Qt.Orientation,
                   role: int = Qt.ItemDataRole.DisplayRole) -> Any:
        if role == Qt.ItemDataRole.TextAlignmentRole:
            return int(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)

        if role == Qt.ItemDataRole.DisplayRole:
            if orientation == Qt.Orientation.Horizontal:
                # 切换model时，出现越界，section的值保留先前model的字段列表长度，当新model的字段长度小于旧model时
                # 可能出现越界的情况，
                if hasattr(self, 'field_chn_list'):
                    if section < len(self.field_chn_list):
                        return self.field_chn_list[section]
                    else:
                        logging.info(f"[警告] 越界字段名：section={section}")
                        return None  # 或者 return f"列{section}"
            else:
                return section + 1
        return None


